/**
 * https://leetcode-cn.com/problems/spiral-matrix/
 * 螺旋矩阵
 * 给你一个 m 行 n 列的矩阵 matrix ，请按照 顺时针螺旋顺序 ，返回矩阵中的所有元素。
 * @param matrix
 */
const spiralOrder = (matrix: number[][]): number[] => {
  const ans: number[] = [];

  // 确定边界
  let top = 0,
    bottom = matrix.length - 1,
    left = 0,
    right = matrix[0].length - 1;

  // 直到出边界了
  while (top <= bottom && left <= right) {
    // 放行
    for (let i = left; i <= right; i++) {
      ans.push(matrix[top][i]);
    }

    // 放列
    for (let i = top + 1; i <= bottom; i++) {
      ans.push(matrix[i][right]);
    }

    // 还没越过边界
    if (left < right && top < bottom) {
      // 放下面的行
      for (let i = right - 1; i >= left; i--) {
        ans.push(matrix[bottom][i]);
      }

      // 放左边的列
      for (let i = bottom - 1; i > top; i--) {
        ans.push(matrix[i][left]);
      }
    }
    // 修改边界
    left++;
    top++;
    bottom--;
    right--;
  }

  return ans;
};

// var spiralOrder2 = function(matrix) {
//     if (!matrix.length || !matrix[0].length) {
//         return [];
//     }

//     const rows = matrix.length, columns = matrix[0].length;
//     const order = [];
//     let left = 0, right = columns - 1, top = 0, bottom = rows - 1;
//     while (left <= right && top <= bottom) {
//         // 行的元素
//         for (let column = left; column <= right; column++) {
//             order.push(matrix[top][column]);
//         }

//         // 列的元素
//         for (let row = top + 1; row <= bottom; row++) {
//             order.push(matrix[row][right]);
//         }

//         // 如果还没超过边界
//         if (left < right && top < bottom) {
//             for (let column = right - 1; column > left; column--) {
//                 order.push(matrix[bottom][column]);
//             }

//             for (let row = bottom; row > top; row--) {
//                 order.push(matrix[row][left]);
//             }
//         }

//         // 交换位置
//         [left, right, top, bottom] = [left + 1, right - 1, top + 1, bottom - 1];
//     }
//     return order;
// };

console.log(
  spiralOrder([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
  ])
);
